package com.example.system.controller;

import com.example.system.model.entity.User;
import com.example.system.service.UserService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springdoc.core.annotations.ParameterObject;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

/**
 * <p>
 * 用户 前端控制器
 * </p>
 *
 * @author 龙茶清欢
 * @since 2025-02-17
 */
@RequiredArgsConstructor
@Tag(name = "用户管理接口") 
@RestController
@RequestMapping("/system/user")
public class UserController {

    private final UserService userService;

    /**
     * 分页查询用户列表
     *
     * @param pageNum  当前页码，默认值：1
     * @param pageSize 每页记录数，默认值：10
     * @param user 包含查询条件的用户实体
     * @return 分页数据（包含总数和当前页数据）
     */
    @Operation(summary = "分页查询", description = "分页获取用户列表")
    @GetMapping("/page")
    public ResponseEntity<Page<UserVO>> page(
            @Parameter(description = "当前页", example = "1") @RequestParam(defaultValue = "1") Integer pageNum,
            @Parameter(description = "每页数量", example = "10") @RequestParam(defaultValue = "10") Integer pageSize,
            @Parameter(description = "用户实体", required = false) @ParameterObject User user) {
        return ResponseEntity.ok(userService.page(new Page<>(pageNum, pageSize)));
    }

    /**
     * 根据ID查询用户详情
     *
     * @param id 记录主键ID
     * @return 完整的用户实体信息
     */
    @Operation(summary = "根据ID查询", description = "通过主键ID获取用户详情")
    @GetMapping("/find/{id}")
    public ResponseEntity<UserVO> getById(
            @Parameter(description = "用户ID", required = true) @PathVariable Long id) {
        return ResponseEntity.ok(userService.getById(id));
    }

    /**
     * 新增用户
     *
     * @param user 包含完整字段的用户实体
     * @return 操作结果（true表示成功）
     */
    @Operation(summary = "新增记录", description = "创建新的用户")
    @PostMapping("/insert")
    public ResponseEntity<Boolean> create(
            @Parameter(description = "用户实体", required = true) @RequestBody User user) {
        return ResponseEntity.ok(userService.save(user));
    }

    /**
     * 修改用户
     *
     * @param user 包含更新字段的用户实体
     * @return 操作结果（true表示成功）
     */
    @Operation(summary = "更新记录", description = "根据ID修改用户")
    @PutMapping("/update")
    public ResponseEntity<Boolean> update(
            @Parameter(description = "用户实体", required = true) @Valid @RequestBody User user) {
        return ResponseEntity.ok(userService.updateById(user));
    }

    /**
     * 删除用户
     *
     * @param ids 要删除的记录主键ID列表
     * @return 操作结果（true表示成功）
     */
    @Operation(summary = "删除记录", description = "根据ID删除用户")
    @DeleteMapping("/delete")
    public ResponseEntity<Boolean> delete(
            @Parameter(description = "用户ID", required = true) @RequestBody Long[] ids) {
        return ResponseEntity.ok(userService.removeByIds(ids));
    }

    /**
     * 根据条件查询用户列表
     *
     * @param user 包含查询条件的用户实体
     * @return 匹配条件的用户列表（非分页）
     */
    @Operation(summary = "条件查询", description = "根据动态条件查询用户列表")
    @GetMapping("/list")
    public ResponseEntity<List<UserVO>> list(
            @ParameterObject User user) {
        return ResponseEntity.ok(userService.list(user));
    }

    /**
     * 导出用户数据到Excel
     *
     * @param query 可选的查询条件（若为空则导出全部数据）
     * @return 包含Excel文件的流响应
     */
    @Operation(summary = "数据导出", description = "导出用户数据到Excel文件")
    @GetMapping("/export")
    public ResponseEntity<Resource> exportData(
            @Parameter(description = "导出条件") @ParameterObject User query) {

        // 获取要导出的数据列表
        List<User> dataList = userService.list(query);

        // 生成Excel文件（需要实现导出逻辑）
        Resource excelFile = userService.exportToExcel(dataList);

        return ResponseEntity.ok()
                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"用户数据导出.xlsx\"")
                .contentType(MediaType.APPLICATION_OCTET_STREAM)
                .body(excelFile);
    }

    /**
     * 从Excel文件导入用户数据
     *
     * @param file 上传的Excel文件（支持xlsx格式）
     * @return 导入结果（成功数量/失败数量）
     */
    @Operation(summary = "数据导入", description = "从Excel文件批量导入用户数据")
    @PostMapping(value = "/import", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public ResponseEntity<ImportResult> importData(
            @Parameter(description = "Excel文件", required = true) @RequestPart("file") MultipartFile file) {

        // 执行导入操作
        ImportResult result = userService.importFromExcel(file);

        return ResponseEntity.ok(result);
    }

}
